package main

import "fmt"

func main() {
	// 1、定义切片,切片就是动态数组,等于java里的list
	var s1 []int           // int类型的切片
	var s2 []string        // string类型的切片
	fmt.Println(s1, s2)    // [] []
	fmt.Println(s1 == nil) // true
	fmt.Println(s2 == nil) // true
	// 切片初始化
	s1 = []int{1, 2, 3}
	s2 = []string{"王", "彪"}
	fmt.Println(s1 == nil) // false
	fmt.Println(s2 == nil) // false
	fmt.Println(s1, s2) // [1 2 3] [王 彪]
	// 长度和容量, 这两个切片的是直接定义的,和自己用数组切的不一样
	fmt.Printf("len(s1): %d  cap(s1): %d \n", len(s1), cap(s1)) // len(s1): 3  cap(s1): 3
	fmt.Printf("len(s2): %d  cap(s2): %d \n", len(s2), cap(s2)) // len(s2): 2  cap(s2): 2

	// 2、由数组得到切片
	a1 := [...]int{1, 3, 5, 7, 9, 11, 13}
	s3 := a1[0:4]
	fmt.Println(s3) // [1 3 5 7]
	// 可以简写
	s4 := a1[:4]
	fmt.Println(s4) // [1 3 5 7]
	// 同样道理,从下标3位置切到最后
	s5 := a1[3:]
	fmt.Println(s5) // [7 9 11 13]
	s6 := a1[:]
	fmt.Println(s6) // [1 3 5 7 9 11 13]
	// 先看s4的容量, 容量指的是底层数组的容量,从第切片的第一个值的下标到数组的最后一个下标的长度
	fmt.Printf("len(s4): %d  cap(s4): %d \n", len(s4), cap(s4)) // len(s4): 4  cap(s4): 7
	// 再看s5,这个切片的第一个值时7,到数组最后一个下标的长度是4
	fmt.Printf("len(s5): %d  cap(s5): %d \n", len(s5), cap(s5)) // len(s5): 4  cap(s5): 4

	// 3、 切片再切片
	s7 := s5[3:]
	fmt.Printf("len(s7): %d  cap(s7): %d \n", len(s7), cap(s7)) // len(s7): 1  cap(s7): 1
	// 修改数组a1的一个元素
	fmt.Println("s5: ", s5) // s5:  [7 9 11 13]
	a1[6] = 100
	fmt.Println("s5: ", s5) // s5:  [7 9 11 100]
	// 说明切片是个引用类型,所以底层都指向同一个数组
	fmt.Println("s7: ", s7) // s7:  [100]

}
